package com.aop;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;


@Component//加入bean容器
@Aspect //面向切面编程中管理切面的类需要添加的注解
/**
 * 注意生成标准注释是alt+shift+enter
 * 这是一个通知类，用来设置spring中面向aop编程中的通知的，同时也可以和切入点（方法）进行结合，形成切入面的管理哈哈
 * @author baka stupid man
 */
public class MyAdvice {
    //设置切入点，准确的说是定义切入点
    @Pointcut("execution(void com.aop.AopTest.talk(*))")
    public void pt(){}

    @Pointcut("execution(boolean com.aop.AopTest.password(*))")
    public void psd(){}
//    @Before("pt()")//通过这一步来绑定切入点与通知的关系
//    public void method(){
//        System.out.println("面向切面编程窝");
//    }

//    @Around("pt()")
//    public void method1(ProceedingJoinPoint pjp) throws Throwable {
//        Signature signature=pjp.getSignature();
//        String typename = signature.getDeclaringTypeName();
//        String name = signature.getName();
//        long start=System.currentTimeMillis();
//        for (int i = 0; i < 1000; i++) {
//            pjp.proceed();
//        }
//        long end=System.currentTimeMillis();
//        System.out.println("千次执行："+typename+"."+name+" 后共花费时间 "+(end-start)+" ms");
//    }

    //下面演示通知如何获取切面方法中传入的参数
    @Before("pt()")
    public void method2(JoinPoint joinPoint){
        System.out.println("method2 is running");
        //通过joinpoint对象进行获取
        Object[] args = joinPoint.getArgs();
        Integer i= (Integer) args[0];
        System.out.println(i);
    }

    @Around("pt()")
    public void method3(ProceedingJoinPoint pjp) throws Throwable {
        System.out.println("method3 is running");
        //通过joinpoint对象进行获取
        Object[] args = pjp.getArgs();
        Integer i= (Integer) args[0];
        System.out.println(i);
        Object proceed = pjp.proceed();
    }
    @Around("psd()")
    public Object passwordmethod(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object[] args = proceedingJoinPoint.getArgs();
        args[0]=((String) args[0]).trim();
        return proceedingJoinPoint.proceed(args);
    }
}
